package com.qf.base.utils;

import com.alibaba.fastjson.JSONObject;
import com.qf.base.vo.UserVo;
import io.jsonwebtoken.*;

import java.util.Date;

/**
 * projectName: automation
 *
 * @author dongshihao
 * Date:2021/9/26   11:07
 * description: 解决token的签发，与token的认证问题
 * token 就是用户的身份令牌
 * 也就是说，用户带着token请求服务器，服务器能知道是谁，就可以
 */
public class JWTUtil {

    /*
     * token 的 签发有效期
     */
    public static final int TOKEN_EXPIRE = 1000 * 60 * 30;

    public static final String TOKEN_KEY = "qianfeng";

    /**
     * 签发token的方法
     *
     * @param userVo 用户对象
     * @return 返回用户的token
     */
    public static String newToken(UserVo userVo) {

        if (userVo == null) {
            return null;
        }
        //token <-->对象
        //token 字符串，能转换成user对象
        //user对象能转换为token
        //user对象是user_service 独有的
        //
        String token = Jwts.builder()
                //设置subject为昵称
                .setSubject(userVo.getNickname())
                //设置token的当前签发时间
                .setIssuedAt(new Date())
                //token的过期时间
                .setExpiration(new Date(System.currentTimeMillis() + TOKEN_EXPIRE))
                //设置携带信息的对象
                .claim("user", JSONObject.toJSONString(userVo))
                .signWith(SignatureAlgorithm.HS256, TOKEN_KEY.getBytes())
                .compact();
        return token;
    }

    /**
     * 解析token的方法
     */
    public static UserVo checkToken(String token) {
        Claims body = null;

        try {
            body = Jwts.parser().setSigningKey(TOKEN_KEY.getBytes()).parseClaimsJws(token).getBody();
        } catch (Exception e) {
            e.printStackTrace();
            //出现异常token 是有问题的
            // 要么是被篡改，或者过期了
            return null;
        }
        Object userJsonString = body.get("user");

        UserVo user = JSONObject.parseObject((String) userJsonString, UserVo.class);
        return user;
    }

    public static void main(String[] args) throws InterruptedException {
        UserVo userVo = new UserVo();
        userVo.setUsername("dongshihao");
        userVo.setPassword("123456");
        userVo.setTelephone("15554557080");
        userVo.setNickname("董世豪");
        String newToken = newToken(userVo);
        Thread.sleep(2000);
        System.out.println(newToken);

        userVo = checkToken(newToken);
        System.out.println(userVo);

    }
}
